package com.chub.study.modules.entity;

import cn.hutool.core.date.DatePattern;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * <p>
 * 行政区划表
 * </p>
 *
 * @author chub
 * @since 2021-08-26
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@TableName("t_city")
@ApiModel(value="TCity", description="行政区划表")
public class TCity implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     *  全局主键策略实现
     *      需要在application.yml文件中添加
     *      mybatis-plus:
     *        mapper-locations:
     *          com/mp/mapper/*
     *      global-config:
     *        db-config:
     *          id-type: uuid/none/input/id_worker/id_worker_str/auto 表示全局主键都采用该策略（如果全局策略和局部策略都有设置，局部策略优先级高）
     */


    /**
     * 当ID为Long时：
     * 1、type = IdType.AUTO时，        数据库自增；数据库上也要勾上自增
     * 2、type = IdType.ASSIGN_ID时，   分配ID（主键类型为 Number(Long和Integer) 或 String）(since 3.3.0) 使用接口 IdentifierGenerator 的方法 nextId（默认实现类为 DefaultIdentifierGenerator 雪花算法）
     * 3、type = IdType.ASSIGN_UUID时， 分配 UUID，主键类型为 String (since 3.3.0)，使用接口 IdentifierGenerator 的方法 nextUUID（默认 default 方法）
     * 4、type = IdType.INPUT时，       手动输入;必须手动输入，数据库自增也没用；
     * 5、type = IdType.NONE时，        没有设置主键类型；跟随全局；全局的主键策略如果没有设置，默认是雪花算法
     */


    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "行政区ID")
    @TableField(value = "CITY_ID")
    private Integer cityId;

    @ApiModelProperty(value = "级别（字典）")
    @TableField("CITY_LVL")
    private Integer cityLvl;

    @ApiModelProperty(value = "行政区名称")
    @TableField("CITY_NAME")
    private String cityName;

    @ApiModelProperty(value = "上级id")
    @TableField("PARENT_ID")
    private Integer parentId;

    @ApiModelProperty(value = "是否叶子节点（0-否，1-是）")
    @TableField("IS_CHILD")
    private Integer isChild;

    @ApiModelProperty(value = "创建人")
    @TableField("CRT_USER")
    private String crtUser;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8")
    // @JsonSerialize(using = LocalDateTimeSerializer.class)
    // @JsonDeserialize(using = JsonDateDeserializer.class)
    // @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
    @ApiModelProperty(value = "创建时间")
    @TableField(value = "CRT_TIME")
    private LocalDateTime crtTime;

    @ApiModelProperty(value = "更新人")
    @TableField("UPT_USER")
    private String uptUser;


    // 数据库中datetime、timestamp格式转LocalDateTime时会是这样：2022-08-05 08:39:15 -->  2022-08-05T08:39:15   增加了一个 'T' 字符
    // 下面这行代码
    // 1、在查询的时候能将： 2022-08-05T08:39:15 转成 2022-08-05 08:39:15  返回给前端  和pattern指定的格式一致
    // 2、在新增、更新的时候能将：  2022-08-05 08:39:15 转成 2022-08-05T08:39:15  保存到数据库 消费方指定数据格式必须和pattern指定的格式一致
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8")
    // @JsonSerialize(using = LocalDateTimeSerializer.class)
//    @JsonDeserialize(using = JsonDateDeserializer.class)
//    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @ApiModelProperty(value = "更新时间")
    //当uptTime传过来为null的时候也新增、更新，需要指定字段的类型, 设置了update = "now()"，则前端传来的参数将不可用
    // @TableField(value = "UPT_TIME", update = "now()", updateStrategy = FieldStrategy.IGNORED, insertStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.DATE)
    private LocalDateTime uptTime;

    @ApiModelProperty(value = "删除标识（0-未删除，1-删除）")
    @TableField("DEL_FLAG")
//    @TableLogic
    private Integer delFlag;

    //"yyyy-MM-dd"
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATE_PATTERN, timezone = "GMT+8")
//    @JsonSerialize(using = LocalDateSerializer.class)
//    @JsonDeserialize(using = LocalDateDeserializer.class)
    @ApiModelProperty(value = "交易日期:前端显示'yyyy-MM-dd'格式，则转成'LocalDate'比较合适。")
    @TableField("TRAN_DATE")
    private LocalDate tranDate;

    //"HH:mm:ss"
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_TIME_PATTERN, timezone = "GMT+8")
//    @JsonSerialize(using = LocalTimeSerializer.class)
//    @JsonDeserialize(using = LocalTimeDeserializer.class)
    @ApiModelProperty(value = "交易时间:前端显示'hh:mm:ss'格式，则转成'LocalTime'比较合适。")
    @TableField("TRAN_TIME")
    private LocalTime tranTime;

    //"yyyy-MM-dd HH:mm:ss.SSS"
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_MS_PATTERN)
//    @JsonDeserialize(using = DateDeserializers.TimestampDeserializer.class)
    @ApiModelProperty(value = "操作时间戳")
    @TableField("OP_TIME")
    private LocalDateTime opTime;

}
